1 つの集約内での整合性
e.g. 注文の合計金額は、個々の行の合計と同じ
情報を保存するのではなく生データから計算するのが一番楽
もちろん、状況によっては追加のデータを永続化する必要がある場合もある
トップレベルの Order に AmountToBill を追加する
データの整合性を保つために、どれかの行が更新されると合計も更新する必要がある
code:fsharp
let changeOrderLinePrice order orderLineId newPrice =
let orderLine = order.OrderLine |> findOrderLine orderLineId
let newOrderLine = { orderLine with Price = newPrice }
let newOrderLines =
order.OrderLines |> replaceOrderLine orderLineId newOrderLine
let newAmountToBill = newOrderLines |> List.sumBy (fun line -> line.Price)
let newOrder = {
order with
OrderLines = newOrderLines
AmountToBill = newAmountToBill
}
newOrder
Order を RDB に保存する場合、Order 自身と OrderLine の各行を同じトランザクションで挿入・更新しなければならない